가. 컨테이너 내에서의 컴포넌트의 레이아웃
모든 컨테이너는 기본적으로 디폴트 레이아웃 관리자를 가지고 있고, 이러한 레이아웃 관리자는 LayoutManage 인터페이스를 구현하고 있습니다. 만약, 컨테이너의 디폴트 레이아웃 관리자가 만족스럽지 못하더라고, 컨테이너의 레이아웃 관리자를 쉽게 다른 레이아웃 관리자로 바꿀 수 있습니다. AWT가 제공해 주는 레이아웃 관리자들에 대해 다음과 같은 몇 가지로 분류할 수 있습니다.
l 매우 간단한(very simple) 레이아웃 관리자: 플로우 레이아웃(FlowLayout), 그리드 레이아웃(GridLayout)
l 특수 목적(special purpose) 레이아웃 관리자: 보더 레이아웃(BorderLayout), 카드 레이아웃(CardLayout)
l 매우 유용한(ultra-flexible) 레이아웃 관리자: 그리드백 레이아웃(GridBagLayout)
나. 플로우 레이아웃 관리자(FlowLayout)
플로우 레이아웃 관리자는 패널 컴포넌트를 위한 디폴트 레이아웃 관리자입니다. 플로우 레이아웃 관리자는 컴포넌트를 레이아웃 할 때, 왼쪽에서 오른쪽으로 그리고 위에서 아래로 차례대로 레이아웃 합니다. 이러한 레이아웃은 텍스트 편집기를 이용하여 텍스트를 입력하는 것과 같이 생각하면 쉽습니다. 다시 말해서, 텍스트 편집기를 이용하여 글자를 입력할 때, 왼쪽에서 오른쪽으로 차례대로 입력하게 되고, 한 줄이 다 차면 다음 줄로 넘어가지요. 이와 마찬가지로, 플로우 레이아웃 관리자도 컴포넌트를 컨테이너의 왼쪽에서 오른쪽으로 하나씩 채워가다가, 오른쪽 끝에 다다르면 다음 줄로 넘어가게 됩니다. 지금까지 AWT 컴포넌트를 살펴볼 때, 알게 모르게 많이 사용했던 레이아웃 관리자입니다. 다음에 나오는 자바 프로그램은 플로우 레이아웃 관리자의 사용을 보여주는 간단한 프로그램입니다.
import java.io.*;
import java.awt.*;
class FlowLayoutTest extends Frame {
public FlowLayoutTest() {
Panel p = new Panel();
p.add(new Button("Button 1"));
p.add(new Button("Button 2"));
p.add(new Button("Button 3"));
p.add(new Button("Button 4"));
p.add(new Button("Button"), "Button");
Choice colorChooser = new Choice();
colorChooser.add("Green");
colorChooser.add("Red");
colorChooser.add("Blue");
p.add(colorChooser, "Colors");
add(p);
}
public static void main(String args[]) {
FlowLayoutTest f = new FlowLayoutTest();
f.pack();
f.setTitle("FlowLayout");
f.setVisible(true);
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java FlowLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 15. FlowLayoutTest.java>
FlowLayout 클래스의 객체 생성자와 주요 메소드를 살펴보면 다음과 같습니다.
l static int LEFT: 플로우 레이아웃 관리자의 왼쪽 정렬 값을 나타냅니다.
l static int CENTER: 플로우 레이아웃 관리자의 가운데 정렬 값을 나타냅니다.
l static int RIGHT: 플로우 레이아웃 관리자의 오른쪽 정렬 값을 나타냅니다.
l static int LEADING: 플로우 레이아웃 관리자의 리딩 에지(leading edge) 정렬 값을 나타냅니다.
l static int TRAILING: 플로우 레이아웃 관리자의 드레일링 에지(leading edge) 정렬 값을 나타냅니다.
l FlowLayout(): 디폴트로 가운데 정렬을 하고, 수평과 수직 간격이 5인 플로우 레이아웃 관리자를 생성합니다.
l FlowLayout(int align): 주어진 정렬을 하고, 수평과 수직 간격이 5인 플로우 레이아웃 관리자를 생성합니다.
l FlowLayout(int align, int hgap, int vgap): 주어진 정렬을 하고, 수평과 수직 간격이 각각 hgap과 vgap인 플로우 레이아웃 관리자를 생성합니다.
l void addLayoutComponent(String name, Component comp): 주어진 이름으로 컴포넌트를 추가합니다.
l void removeLayoutComponent(Component comp): 컴포넌트를 제거합니다.
l int getAlignment(): 정렬 방식의 값을 얻습니다.
l void setAlignment(int align): 정렬 방식을 설정합니다.
l void layoutContainer(Container target): 컨테이너에 대한 레이아웃을 행합니다.
l int getHgap(): 수평 간격을 얻습니다.
l int getVgap(): 수직 간격을 얻습니다.
l void setHgap(int hgap): 수평 간격을 설정합니다.
l void setVgap(int vgap): 수직 간격을 설정합니다.
다. 그리드 레이아웃 관리자(GridLayout)
그리드 레이아웃 관리자는 컨테이너의 영역을 주어진 행과 열 크기의 셀들로 나누고, 동등한 크기의 각 셀에 컴포넌트를 하나씩 위치시키므로, 모든 컴포넌트의 크기는 동일하게 됩니다. 그리드 레이아웃 관리자는 셀 단위의 레이아웃을 수행하고, 이러한 셀을 사각형 그리드(rectangular grid)라 할 수 있으므로, 그리드 레이아웃 관리자라 하는 것입니다.
다음에 나오는 자바 프로그램은 플로우 레이아웃 관리자의 사용을 보여주는 간단한 프로그램입니다.
import java.io.*;
import java.awt.*;
class GridLayoutTest extends Frame {
public GridLayoutTest() {
Panel p1 = new Panel(new GridLayout());
p1.add(new Button("Button 1"));
p1.add(new Button("Button 2"));
p1.add(new Button("Button 3"));
p1.add(new Button("Button 4"));
p1.add(new Button("Button"), "Button");
Choice colorChooser = new Choice();
colorChooser.add("Green");
colorChooser.add("Red");
colorChooser.add("Blue");
p1.add(colorChooser, "Colors");
Panel p2 = new Panel(new GridLayout(2, 3));
p2.add(new Button("Button 1"));
p2.add(new Button("Button 2"));
p2.add(new Button("Button 3"));
p2.add(new Button("Button 4"));
p2.add(new Button("Button"), "Button");
add("North", p1);
add("Center", p2);
}
public static void main(String args[]) {
GridLayoutTest f = new GridLayoutTest();
f.pack();
f.setTitle("GridLayout");
f.setVisible(true);
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java GridLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 16. GridLayoutTest.java>
위의 예제에서는 그리드 레이아웃 관리자를 사용하는 두 개의 패널 컴포넌트를 프레임이 포함하도록 하고 있습니다. 이 때, 프레임의 레이아웃 관리자는 윈도우 컴포넌트의 디폴트 레이아웃 관리자인 보더 레이아웃 관리자입니다. 그리고, 첫 번째 패널 컴포넌트는 하나의 행을 갖는 그리드 레이아웃 관리자를 갖고, 두 번째 패널 컴포넌트는 2행 3열을 갖고 수평 간격은 10, 수직 간격은 5인 그리드 레이아웃 관리자를 갖고 있습니다.
GridLayout 클래스의 객체 생성자와 주요 메소드를 살펴보면 다음과 같습니다.
l GridLayout(): 단 하나의 행을 갖고 각 컴포넌트는 하나의 열을 차지하도록 레이아웃하는 그리드 레이아웃 관리자를 생성합니다.
l GridLayout(int rows, int cols): 주어진 행과 열을 갖는 레이아웃하는 그리드 레이아웃 관리자를 생성합니다.
l GridLayout(int rows, int cols, int hgap, int vgap): 주어진 행과 열을 갖고 수평과 수직 간격이 각각 hgap과 vgap인 그리드 레이아웃 관리자를 생성합니다.
l void addLayoutComponent(String name, Component comp): 주어진 이름으로 컴포넌트를 추가합니다.
l int getColumns(): 열의 크기를 얻습니다.
l int getHgap(): 수평 간격을 얻습니다.
l int getRows(): 행의 크기를 얻습니다.
l int getVgap(): 수직 간격을 얻습니다.
l void layoutContainer(Container parent): 컨테이너를 레이아웃 합니다.
l void removeLayoutComponent(Component comp): 주어진 컴포넌트를 제거합니다.
l void setColumns(int cols): 열의 크기를 설정합니다.
l void setHgap(int hgap): 수평 간격을 설정합니다.
l void setRows(int rows): 행의 크기를 설정합니다.
l void setVgap(int vgap): 수직 간격을 설정합니다.
라. 보더 레이아웃 관리자(BorderLayout )
보더 레이아웃 관리자는 프레임(Frame) 컴포넌트와 대화상자(Dialog) 컴포넌트 등과 같은 모든 윈도우(Window) 컴포넌트를 위한 디폴트 레이아웃 관리자입니다. 보더 레이아웃은 동(east), 서(west), 남(south), 북(north), 그리고 중앙(center) 등 다섯 개의 영역으로 나누어 컴포넌트들을 관리합니다. 이 다섯 개의 영역은 기본적으로 중앙 영역에 위치시키고, 사용자가 나머지 영역(동, 서, 남, 북) 중 한 영역에 위치시키고자 하면 해당 영역을 할당하고, 나머지 부분은 다시 중앙 영역에 할당하게 됩니다. 다음에 나오는 자바 프로그램은 보더 레이아웃 관리자를 사용하는 예를 보여주고 있습니다.
import java.awt.*;
class BorderLayoutTest extends Frame {
public BorderLayoutTest() {
Window w1 = new Window(this);
w1.setLayout(new BorderLayout(10, 5));
w1.add("East", new Button("W1-East"));
w1.add("West", new Button("W1-West"));
w1.add("North", new Button("W1-North"));
w1.add("Center", new Button("W1-Center"));
w1.add("South", new Button("W1-South"));
w1.setLocation(100,100);
w1.setSize(200,100);
w1.show();
Window w2 = new Window(this);
w2.add("East", new Button("W2-East"));
w2.add("West", new Button("W2-West"));
w2.add("North", new Button("W2-North"));
w2.add("South", new Button("W2-South"));
w2.setLocation(310,100);
w2.setSize(200,100);
w2.show();
Window w3 = new Window(this);
w3.add("Center", new Button("W3-Center"));
w3.setLocation(100,210);
w3.setSize(200,100);
w3.show();
Window w4 = new Window(this);
BorderLayout b = new BorderLayout(8, 16);
w4.setLayout(b);
w4.add("East", new Button("W4-East"));
w4.add("West", new Button("W4-West"));
w4.add(new Button("W4-Center"));
w4.setLocation(310,210);
w4.setSize(200,100);
w4.show();
}
public static void main(String args[]) {
BorderLayoutTest f = new BorderLayoutTest();
f.pack();
f.setTitle("BorderLayout");
f.setVisible(true);
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java BorderLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 17. BorderLayoutTest.java>
BorderLayout 클래스의 객체 생성자와 주요 메소드를 살펴보면 다음과 같습니다.
l BorderLayout(): 컴포넌트들 간의 수평 간격과 수직 간격이 0인 보더 레이아웃 관리자를 생성합니다.
l BorderLayout(int hgap, int vgap): 컴포넌트들 간의 수평 간격(hgap)과 수직 간격(vgap)을 갖는 보더 레이아웃 관리자를 생성합니다.
l int getHgap(): 컴포넌트들 간의 수평 간격(hgap)을 얻습니다.
l int getVgap(): 컴포넌트들 간의 수직 간격(vgap)을 얻습니다.
l void setHgap(int hgap): 컴포넌트들 간의 수평 간격(hgap)을 설정합니다.
l void setVgap(int vgap):: 컴포넌트들 간의 수직 간격(vgap)을 설정합니다.
마. 카드 레이아웃 관리자(CardLayout)
카드 레이아웃 관리자는 여러 장의 카드를 겹쳐 배치하는 식으로 관리하고, 컨테이너가 포함하고 있는 컴포넌트들을 한 장의 카드처럼 다루어. 한 번에 한 장씩 사용자가 보기를 원하는 카드를 보여주고, 여러 컴포넌트가 카드 레이아웃 관리자에 등록이 될 경우 가장 처음 등록된 컴포넌트를 디폴트로 보여줍니다.
이러한 레이아웃은 일반적으로 사용자 옵션을 입력받기 위해 윈도우에서 많이 사용하는 하는 레이아웃입니다. 옵션 메뉴를 분류하여 여러 장(카드로 비유됨)을 준비하여 두고, 사용자가 보기를 원하는 카드(윈도우에서는 탭이라 함)를 보여주기 위해 카드 레이아웃 관리자를 사용합니다. 이 때 각 장의 메뉴는 하나의 패널을 이용하여 관리하는 것이 효율적입니다. 다음에 나오는 자바 프로그램은 카드 레이아웃 관리자의 사용을 보여주는 간단한 프로그램입니다.
import java.io.*;
import java.awt.*;
class CardLayoutTest extends Frame {
CardLayout c=null;
public CardLayoutTest() {
c = new CardLayout();
setLayout(c);
Panel p1 = new Panel();
p1.setLayout(new BorderLayout());
p1.add("East", new Button("East"));
p1.add("West", new Button("West"));
p1.add("North", new Button("North"));
p1.add("Center", new Button("Center"));
p1.add("South", new Button("South"));
Panel p2 = new Panel();
p2.add(new Button("Button 1"));
p2.add(new Button("Button 2"));
p2.add(new Button("Button 3"));
p2.add(new Button("Button 4"));
Panel p3 = new Panel();
p3.setLayout(new GridLayout(4, 1));
p3.add(new Button("Button p3-1"));
p3.add(new Button("Button p3-2"));
p3.add(new Button("Button p3-3"));
p3.add(new Button("Button p3-4"));
add(p1, "BorderLayout");
add(p2, "DefaultLayout");
add(p3, "GridLayout");
add(new Button("Button"), "Button");
Choice colorChooser = new Choice();
colorChooser.add("Green");
colorChooser.add("Red");
colorChooser.add("Blue");
add(colorChooser, "Colors");
}
public static void main(String args[]) {
CardLayoutTest f = new CardLayoutTest();
int ch;
f.pack();
f.setTitle("CardLayout");
f.setVisible(true);
try {
while((ch=System.in.read()) != -1) {
if(f.c != null) {
f.c.next(f);
}
}
} catch(IOException e) {
}
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java CardLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 18. CardLayoutTest.java>
위의 자바 프로그램에서는 다섯 개의 컴포넌트를 프레임에 추가하여, 이를 카드 레이아웃 관리자를 이용하여 관리하고 있습니다. 이 때, 다섯 장의 카드를 가지고 있다고 볼 수 있습니다. 그리고, 위의 프로그램에서는 아직 이벤트 처리에 대해서 살펴보지 않았기 때문에 간단하게 리턴키를 치면 다음 카드로 바꾸도록 하고 있는데, MS 플랫폼에서는 리턴키가 '\n'와 '\r' 등 두 문자로 구성되기 때문에 두 개의 키가 쳐진 것처럼 카드가 두 장씩 넘어가데 됩니다. 그렇기 때문에 위와 같이 리턴키를 입력받아 카드 레이아웃 관리자를 테스트하고자 한다면, 카드는 두 장씩 넘어가기 때문에 홀수 장을 만들어야 합니다.
CardLayout 클래스의 객체 생성자와 주요 메소드를 살펴보면 다음과 같습니다.
l CardLayout(): 컴포넌트들 간의 수평 간격과 수직 간격이 0인 카드 레이아웃 관리자를 생성합니다.
l CardLayout(int hgap, int vgap): 컴포넌트들 간의 수평 간격이 hgap이고, 수직 간격이 vgap인 카드 레이아웃 관리자를 생성합니다.
l void addLayoutComponent(Component comp, Object constraints): 주어진 컴포넌트를 카드 레이아웃 관리자의 내부 이름 테이블에 삽입합니다.
l void addLayoutComponent(String name, Component comp): addLayoutComponent(Component, Object) 메소드로 바뀌었습니다.
l void first(Container parent): 주어진 컨테이너에 포함된 첫 번째 카드를 보여줍니다.
l void last(Container parent): 주어진 컨테이너에 포함된 마지막 번째 카드를 보여줍니다.
l void next(Container parent): 주어진 컨테이너에 포함된 다음 카드를 보여줍니다.
l void previous(Container parent): 주어진 컨테이너에 포함된 이전 카드를 보여줍니다.
l void show(Container parent, String name): 주어진 컨테이너에 포함된 컴포넌트 중 주어진 이름을 가진 컴포넌트로 전환합니다(보여줍니다).
l void removeLayoutComponent(Component comp): 주어진 컴포넌트를 제거합니다.
l void layoutContainer(Container parent): 이 카드 레이아웃 관리자를 이용하여 주어진 컨테이너에 포함된 컴포넌트들을 레이아웃 합니다.
l int getHgap(): 컴포넌트들 간의 수평 간격(hgap)을 얻습니다.
l int getVgap(): 컴포넌트들 간의 수직 간격(vgap)을 얻습니다.
l void setHgap(int hgap): 컴포넌트들 간의 수평 간격(hgap)을 설정합니다.
l void setVgap(int vgap):: 컴포넌트들 간의 수직 간격(vgap)을 설정합니다.
바. 그리드백 레이아웃 관리자(GridBagLayout)
그리드백 레이아웃 관리자는 AWT에서 제공해 주는 레이아웃 관리자 중에서 가장 복잡하고 다양한 형태를 가질 수 있는 레이아웃 관리자입니다. 그리드백 레이아웃 관리자는 HTML 페이지를 생성하기 위해 사용하는 테이블과 같은 방식으로 레이아웃을 수행합니다. 다시 말해서, 레이아웃 영역을 기본적으로 셀 단위로 나누어 놓고, 행과 열에 대해 셀 크기를 확장할 수 있도록 하는 것입니다. 그리드 레이아웃 관리자는 모든 컴포넌트가 같은 크기의 셀에 위치되고 크기 변경이 불가능하지만, 그리드백 레이아웃 관리자는 셀 단위의 레이아웃을 행하기는 하지만 각 컴포넌트가 서로 다른 크기를 가질 수 있도록 할 수 있습니다.
다음에 나오는 자바 프로그램은 그리드백 레이아웃 관리자의 사용을 보여주는 간단한 프로그램입니다.
import java.awt.*;
public class GridBagLayoutTest extends Frame {
TextField smtpServer, mailFrom, rcptTo, subject;
TextArea body;
GridBagLayout gbl;
GridBagConstraints gbc;
public GridBagLayoutTest() {
smtpServer = new TextField(40);
mailFrom = new TextField(40);
rcptTo = new TextField(40);
subject = new TextField(40);
body = new TextArea(5, 40);
gbl = new GridBagLayout();
gbc = new GridBagConstraints();
setLayout(gbl);
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
add(new Label("메일서버: ", Label.RIGHT), 0, 0, 1, 1);
add(smtpServer, 1, 0, 3, 1);
add(new Label("From: ", Label.RIGHT), 0, 1, 1, 1);
add( mailFrom, 1, 1, 3, 1);
add(new Label("To: ", Label.RIGHT), 0, 2, 1, 1);
add(rcptTo, 1, 2, 3, 1);
add(new Label("제 목: ", Label.RIGHT), 0, 3, 1, 1);
add(subject, 1, 3, 3, 1);
add(new Label("내 용: ", Label.RIGHT), 0, 4, 1, 1);
add(body, 1, 4, 1, 1);
add(new Button("Send"), 0, 5, 2, 1);
pack(); // setSize(400, 300);
}
private void add(Component c, int x, int y, int w, int h) {
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;
gbl.setConstraints(c, gbc);
add(c);
}
public static void main(String args[]) {
GridBagLayoutTest f = new GridBagLayoutTest();
f.setTitle("GridBagLayout");
f.setVisible(true);
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java GridBagLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 19. GridBagLayoutTest.java>
그리드백 레이아웃 관리자가 컴포넌트들에 대한 레이아웃을 행할 때, 각 컴포넌트가 차지하는 셀의 위치, 수평 크기, 수직 크기 등을 설정해 주어야 하는데, 이를 위해 자바에서는 GridBagConstraints 클래스를 제공해 줍니다. 먼저, GridBagConstraints 클래스가 제공해주는 기능을 살펴보도록 하겠습니다.
l GridBagConstraints.gridx, GridBagConstraints.gridy: 컴포넌트가 위치할 셀의 x 값과 y 값을 나타내며, 가장 왼쪽 위 셀의 gridx과 gridy 값은 0입니다. 컴포넌트를 순서대로 위치시키고자 할 때는 GridBagConstraints.RELATIVE를 사용합니다.
l GridBagConstraints.gridwidth, GridBagConstraints.gridheight: 컴포넌트가 차지할 너비와 높이를 나타내는 셀의 개수이며, 디폴트 값은 1입니다. gridwidth를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 행의 마지막 셀이되고, gridheight 를 GridBagConstraints.REMAINDER 값으로 설정하면 현재 열의 마지막 셀이됩니다. gridwidth를 GridBagConstraints. RELATIVE 값으로 설정하면 현재 행의 다음 셀부터 마지막 셀까지 차지하고, gridheight 를 GridBagConstraints. RELATIVE 값으로 설정하면 현재 열의 다음 셀부터 마지막 셀까지 차지하도록 합니다.
l GridBagConstraints.fill: 컴포넌트의 디스플레이 영역이 컴포넌트가 요청한 크기보다 클 때, 크기설정을 다시 할 것인가를 결정합니다. GridBagConstraints 클래스는 다음과 같은 값을 가능한 값으로 제공해 주고 있습니다.
l GridBagConstraints.NONE: 디폴트 값
l GridBagConstraints.HORIZONTAL: 수평적으로 확장하고 수직적으로는 확장하지 않습니다.
l GridBagConstraints. VERTICAL: 수직적으로 확장하고 수평적으로는 확장하지 않습니다.
l GridBagConstraints.BOTH: 수평 및 수직으로 확장합니다.
l GridBagConstraints.ipadx, GridBagConstraints.ipady: 컴포넌트 너비의 최소값에 (ipadx * 2) 픽셀을 더하고, 컴포넌트 높이의 최소값에 (ipady * 2) 픽셀을 더합니다.
l GridBagConstraints.insets: 컴포넌트와 디스플레이 영역의 엣지 사이의 공간의 크기를 나타내고, 다음과 같은 값을 GridBagConstraints 클래스에서 제공해 줍니다.
l GridBagConstraints.anchor: 컴포넌트가 디스플레이 영역보다 작을 때, 컴포넌트가 위치할 위치를 나타냅니다. 이 값으로는 GridBagConstraints.CENTER(디폴트 값), GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST, GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHWEST, GridBagConstraints.WEST, and GridBagConstraints.NORTHWEST. 등이 있습니다.
l GridBagConstraints.weightx, GridBagConstraints.weighty: 컴포넌트의 디스플레이 영역이 컴포넌트가 요청한 크기보다 클 때 남는 영역을 각 컴포넌트들에게 배분해 주어야 하는데, 이 때 컴포넌트가 차지할 너비(weightx)와 높이(weighty)에 대한 웨이트(weight)를 나타냅니다. 이 너비와 높이에 대한 웨이트는 각 컴포넌트마다 달리 줄 수 있습니다. 만약, 모든 컴포넌트의 너비와 높이에 대한 웨이트가 0이면, 디스플레이 영역이 커지더라도(사용자가 윈도우의 창을 키울 때) 각 컴포넌트에 배당되는 영역이 없으므로 모든 컴포넌트들은 한군데 위치하게 되고 남는 영역은 그냥 빈공간으로 나타나게 됩니다.
다음에 나오는 자바 프로그램은 GridBagConstraints 객체의 값을 적당하게 설정하여 각 컴포넌트를 컨테이너에 등록한 후, 그리드백 레이아웃 관리자를 이용하여 보여주는 프로그램입니다.
import java.awt.*;
class GridBagLayoutTest2 extends Frame {
public GridBagLayoutTest2() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setLayout(gridbag);
c.ipadx = 8;
c.ipadx = 8;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0; c.weighty = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.weightx = 0.5; c.weighty = 0.5;
makebutton("Button4", gridbag, c);
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.0; c.weighty = 0.0; //reset to the default
makebutton("Button5", gridbag, c); //another row
c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row
makebutton("Button6", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.weightx = 0.75; c.weighty = 0.75;
makebutton("Button7", gridbag, c);
c.gridwidth = 1; //reset to the default
c.gridheight = 2;
c.weightx = 0.25; c.weighty = 0.25;
makebutton("Button8", gridbag, c);
c.weighty = 0.0; //reset to the default
c.gridwidth = GridBagConstraints.REMAINDER; //end row
c.gridheight = 1; //reset to the default
makebutton("Button9", gridbag, c);
makebutton("Button10", gridbag, c);
setSize(300, 100);
}
protected void makebutton(String name,
GridBagLayout gridbag,
GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
public static void main(String args[]) {
GridBagLayoutTest2 f = new GridBagLayoutTest2();
f.pack();
f.setTitle("GridBagLayout2");
f.setVisible(true);
}
}
/*
* Results:
D:\AIIT\JAVA\Working\08>java GridBagLayoutTest2
D:\AIIT\JAVA\Working\08>
*/
<프로그램 20. GridBagLayoutTest2.java>
위의 자바 프로그램을 실행한 후, 윈도우의 크기를 적당하게 조절해 보면, 주어진 웨이트에 따라 남는 영역이 배분되므로 각 컴포넌트의 크기가 웨이트에 따라 변하게 됨을 알 수 있습니다. 그리고, GridBagConstraints.REMAINDER와 GridBagConstraints. RELATIVE의 차이점도 볼 수 있습니다.
GridBagLayout 클래스의 객체 생성자와 주요 메소드를 살펴보면 다음과 같습니다.
l GridBagLayout(): 그리드백 레이아웃 관리자를 생성합니다.
l void addLayoutComponent(Component comp, Object constraints): 주어진 컴포넌트를 주어진 constraints 객체를 이용하여 추가합니다.
l void addLayoutComponent(String name, Component comp): 주어진 이름으로 컴포넌트를 추가합니다.
l GridBagConstraints getConstraints(Component comp): 주어진 컴포넌트에 연결된 GridBagConstraints 객체를 얻습니다.
l Point getLayoutOrigin(): 레이아웃 그리드의 시작 위치값을 얻스비다.
l double[][] getLayoutWeights(): 레이아웃 그리드의 행과 열이 갖는 웨이트 배열을 얻습니다.
l void invalidateLayout(Container target): 레이아웃을 무효화(invalidate) 합니다.
l void layoutContainer(Container parent): 이 그리드백 레이아웃 관리자를 이용하여 주어진 컨테이너를 레이아웃 합니다.
l void removeLayoutComponent(Component comp): 주어진 컴포넌트를 제거합니다.
l void setConstraints(Component comp, GridBagConstraints constraints): 주어진 컴포넌트를 위한 constraints를 설정합니다.
사. 레이아웃 관리자를 사용하지 않는 레이아웃(Absolute Positioning)
지금까지 여러 가지 형태의 레이아웃 관리자에 대하여 살펴보았습니다. 이러한 레이아웃 관리자는 시스템(플랫폼)에 독립적으로 컴포넌트들을 컨테이너에 레이아웃 할 수 있도록 해 주었습니다. 여기에서는 사용자가 원하는 위치에 직접 컴포넌트를 위치하도록 하는 방법에 대하여 살펴보도록 하겠습니다. 이러한 방법은 GUI 툴을 이용하여 컴포넌트들에 대한 레이아웃을 행할 때 사용될 수 있는 방법입니다. 그러나, 이러한 방법은 시스템의 폰트가 바뀐다거나 자바 프로그램을 실행하는 플랫폼이 바뀐다거나 할 때, 컴포넌트의 레이아웃이 처음에 의도한 것과는 다르게 나타날 수 있으므로 주의하여야 합니다.
다음에 나오는 자바 프로그램은 레이아웃 관리자를 사용하지 않고, 컴포넌트의 위치를 직접 설정해 주는 방법을 보여주는 프로그램입니다.
import java.awt.*;
public class NoLayoutTest extends Frame {
Button b1, b2, b3;
public NoLayoutTest() {
Insets insets;
setLayout(null);
setSize(200, 100);
// setVisible(true); // (a)
b1 = new Button("one");
b2 = new Button("two");
b3 = new Button("three");
insets = getInsets();
b1.setBounds(50 + insets.left, 5 + insets.top, 50, 20);
b2.setLocation(new Point(70 + insets.left, 35 + insets.top));
b2.setSize(new Dimension(50, 20));
b3.setLocation(130 + insets.left, 15 + insets.top);
b3.setSize(50, 30);
add(b1);
add(b2);
add(b3);
}
public static void main(String args[]) {
NoLayoutTest f = new NoLayoutTest();
f.setTitle("NoLayout");
f.setVisible(true); // (b)
}
}
/*
* Results:
(a) 부분을 주석처리한 후 실행
D:\AIIT\JAVA\Working\08>java NoLayoutTest
(b) 부분을 주석처리한 후 실행
D:\AIIT\JAVA\Working\08>java NoLayoutTest
D:\AIIT\JAVA\Working\08>
*/
<프로그램 21. NoLayoutTest.java>
위의 자바 프로그램을 살펴보면, 레이아웃 관리자를 사용하지 않고, 자바 프로그램 개발자가 임의대로 레이아웃을 하려 할 때 주의해야 할 점 중 하나를 보여주고 있습니다. 자바에서 테두리를 구하기 위해서는 먼저 컴포넌트가 보이는(visible) 상태여야 합니다. 그렇지 않을 경우, 테두리(inset)의 값은 모두 0이 됩니다. 그러한 이유로, 위와 같은 결과가 발생하는 것입니다.
레이아웃 관리자를 사용하지 않고 컴포넌트의 위치를 직접 설정할 수 있도록 하기 위해, Component 클래스가 제공해 주는 주요 메소드를 살펴보면 다음과 같습니다.
l void setLocation(int x, int y): 컴포넌트를 새로운 위치로 옮깁니다.
l void setLocation(Point p): 컴포넌트를 새로운 위치로 옮깁니다.
l Dimension size(): getSize() 메소드로 바뀌었습니다.
l void setSize(Dimension d): 컴포넌트의 너비와 높이를 각각 d.width와 d.height로 설정합니다.
l void setSize(int width, int height): 컴포넌트의 너비와 높이를 각각 width와 height로 설정합니다.
l void reshape(int x, int y, int width, int height): setBounds(int, int, int, int) 메소드로 바뀌었습니다.
l void resize(Dimension d): setSize(Dimension) 메소드로 바뀌었습니다.
l void resize(int width, int height): setSize(int, int) 메소드로 바뀌었습니다.
l void setBounds(int x, int y, int width, int height): 컴포넌트를 주어진 위치로 옮기고 크기를 변경합니다.
l void setBounds(Rectangle r): 컴포넌트를 주어진 위치로 옮기고 크기를 변경합니다.
[출처] 제8장 AWT - 4. 컨테이너와 레이아웃 관리자(Layout Manager)|작성자 뮤지션
http://blog.naver.com/leiphie?Redirect=Log&logNo=17618180 |